package com.ketayao.fensy.webutil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.ketayao.fensy.util.FileUtils;
import com.ketayao.fensy.util.FilenameUtils;

/**
 * 存储服务
 */
public abstract class Storage {

    private final static String PATH_STYLE = "yyyy/MM/dd_HHmmss_";

    public abstract String getBasePath();

    /**
     * 读取文件数据
     * @param path
     * @return
     * @throws FileNotFoundException
     */
    public FileInputStream read(String path) throws FileNotFoundException {
        return new FileInputStream(getBasePath() + path);
    }

    /**
     * 读取文件
     * @param path
     * @return
     * @throws FileNotFoundException
     */
    public File readFile(String path) throws FileNotFoundException {
        return new File(getBasePath() + path);
    }

    /**
     * 判断文件是否存在
     * @param path
     * @return
     */
    public boolean exist(String path) {
        return new File(getBasePath() + path).exists();
    }

    /**
     * 保存文件，并返回对应的文件URI
     * @param f
     * @return
     * @throws IOException 
     */
    public String save(File f) throws IOException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(PATH_STYLE);
        String uri = simpleDateFormat.format(new Date()) + FilenameUtils.getBaseName(f.getName())
                     + "." + FilenameUtils.getExtension(f.getName()).toLowerCase();
        return save(f, uri);
    }

    /**
     * 保存文件到指定路径
     * @param f
     * @param path
     * @throws IOException 
     */
    public String save(File f, String path) throws IOException {
        File dest = new File(getBasePath() + path);
        if (!dest.getParentFile().exists())
            dest.getParentFile().mkdirs();
        FileUtils.copyFile(f, dest);
        return path;
    }

    /**
     * 根据路径来删除文件
     * @param path
     * @throws IOException
     */
    public void delete(String path) throws IOException {
        File dest = new File(getBasePath() + path);
        FileUtils.deleteFile(dest);
    }
}
